<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script type="text/javascript">
        function Fn()
        {
            this.test1=function()
            {
                console.log("test1()");
            };
        }
        Fn.prototype.test2=function()
        {
            console.log("test2()");
        };

        //利用构造函数Fn()创建新函数fn
        var fn=new Fn();
        //在控制台输出fn
        console.log(fn);
        //在fn继承的Fn函数中有test1
        fn.test1();
        //在fn继承的Fn函数原型函数prototype中有test2
        fn.test2();
        console.log(fn.toString());
        //执行fn中的test3()函数
        //fn.test3();控制台显示无法找到

        //1.函数的显式原型指向的对象默认是空Object实力对象（但Object不满足）
        console.log(Fn.prototype instanceof Object);//true
        console.log(Object.prototype instanceof Object);//false
        console.log(Function.prototype instanceof Object);//true
        //2.所有函数都是Function的实例（包含Function）
        console.log(Function.__proto__ === Function.prototype);//true
        //Object的原型对象是原型链尽头
        console.log(Object.prototype.__proto__);//null
        console.log(Object.prototype);//原型链尽头
    </script>
</head>
<body>
    <!--
        1.原型链（图解）
        访问一个对象的属性
            现在自身属性中查找，找到返回
            如果没有，再沿着__proto__这条链向上查找，找到返回
            如果最终没找到，返回undefined
        别名：隐式原型链
        作用：查找对象的属性（方法）
        2.构造函数/原型/实体对象的关系（图解）
        3.构造函数/原型/实体对象的关系2（图解）

        所有的构造函数都通过new Function产生
        实例对象的隐式原型=构造函数的显式原型
    -->
    <img src="../IMG/02-03.原型链.png">
    <img src="../IMG/02-03.原型链2.png">
    <img src="../IMG/02-03.原型链3.png">
</body>
</html>